﻿using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class CreatRope : MonoBehaviour
{


    //private GameObject links;//获取构成线的质点//此处用加载的方式不用获取

    private  Rigidbody2D hook;//钉子

    private Netweight  netweight;//获取挂载在网上面的脚本

    private int linknum;//需要生成绳子的长度

    private List<Transform> linkTransform1 = new List<Transform>();//用于存储每一个质点的Transform

    private LineRenderer lineRenderer1;//未切断前划线的LineRender和切断后的第二段

    private LineRenderer lineRenderer2;//切断后的第二段

    private List<Vector3> positions1 = new List<Vector3>();//用于存储未切断前划线中每一个点的位置信息，和切断之后第一段的位置

    private List<Vector3> positions2 = new List<Vector3>();//用与存储切断之后第二段的每一个点的位置信息

    public  bool isCut = false;//用于判断绳子是否被切断的布尔值

    public  int Ropenum;//获取质点的位置（是在第几个）


    public void Start()
    {
        linknum = Random.Range(15,20);
        Debug.Log(linknum);
        lineRenderer1 = transform.GetChild(1).GetComponent<LineRenderer>();
        lineRenderer2 = transform.GetChild(2).GetComponent<LineRenderer>();

        lineRenderer1.startWidth = 0.2f;
        lineRenderer1.endWidth = 0.2f;

        lineRenderer2.startWidth = 0.2f;
        lineRenderer2.endWidth = 0.2f;

        netweight = transform.GetChild(3).GetComponent<Netweight>();
        hook = transform.GetChild(0).GetComponent<Rigidbody2D>();

        RopeGenerator();//调用生成绳子的方法

      
    }

    /*划线方法实现思路
     * 划线就是把点和点之间用线连起来，我们只需要动态的获取组成绳子的每一个点
     * 的位置，然后把他们的信息存进一个Vector3类型的list里面，然后再设置给LineRender即可
     * 注意：LineRender只接受数组，所以在设置给LineRender的时候要把List通过ToArray()方法转
     * 以上就完成了一次划线，在进行下一次划线的时候要把List里面的值清空，因为现在这个时间点
     * 每个质点的位置可能已经发生了变化，在清空之后，再按照第一次划线的方法划线。
     * 
     */
    



/*
 未剪短就是正常的划线方法
 剪短之后就是用两个LineRender分别划第一段和第二段
 （注意要把去除的那个质点的Transform从list里面去掉，
 或者是记录位置信息时不要把该质点的位置信息记录进数组）
         
剪短其实就是把连成线的质点从中间拿走其中一个，这样有一处上下不相连，线自然就断了
 */
    private void Update()
    {
        //未剪短的时候的划线方法
        if (isCut == false)
        {
            for (int i = 0; i < linkTransform1.Count; i++)
            {
                positions1.Add(linkTransform1[i].position);
            }
            lineRenderer1.positionCount = positions1.Count;//设置LinRender中的数组的的长度
            lineRenderer1.SetPositions(positions1.ToArray());//把位置信息设置给LineRender
            positions1.Clear();//把集合清空
        }
        //剪短后的划线方法
        else if (isCut == true)
        {
            //第一段
            for (int i = 0; i < Ropenum; i++)//记录第一个到被切断的质点的前一个
            {
                positions1.Add(linkTransform1[i].position);

            }
            lineRenderer1.positionCount = positions1.Count;
            lineRenderer1.SetPositions(positions1.ToArray());
            positions1.Clear();

            //第二段
            for (int i = Ropenum + 1; i < linkTransform1.Count; i++)//记录被切断的质点的后一个到最后一个
            {
                positions2.Add(linkTransform1[i].position);
            }
            lineRenderer2.positionCount = positions2.Count;
            lineRenderer2.SetPositions(positions2.ToArray());
            positions2.Clear();
        }
    }


    /*
     整体实现思路：绳子是由一个一个质点（有质量的点，不是单纯的位置）通过
     HingeJoint2D连成的（这才是真的绳子，不要误以为LineRender画出来的就是绳子，
     LineRendere只不过是给绳子穿了一件漂亮的衣服）
     首先在起点有一个固定的“钉子”，然后生成的第一个质点用HingeJoint2D和钉子连接，
     然后再实例化下一个质点再和上一个质点连接，这样一个连一个就形成了绳子，当检测到
     是最后一个质点连接了就把网挂上去
     */

    public void RopeGenerator()
    {
        Rigidbody2D temp = hook;

        linkTransform1.Add(hook.gameObject.GetComponent<Transform>()); //钉子是第一个所以要把钉子最先放进去  
        for (int i = 0; i < linknum; i++)
        {
            //GameObject link = (GameObject)Instantiate(links, transform.position, Quaternion.identity);//Demo中通过获取得到links时用这个方法
            GameObject link = (GameObject)Instantiate(Resources.Load("Rope") as GameObject, transform.position, Quaternion.identity);
            link.transform.SetParent(this.transform);
            link.GetComponent<Ropenum>().num = i + 1;//是第几个质点
            linkTransform1.Add(link.transform);
            HingeJoint2D hont = link.GetComponent<HingeJoint2D>();
            hont.connectedBody = temp;

            if (i < linknum - 1)
            {
                temp = link.GetComponent<Rigidbody2D>();
            }
            else
            {
                 netweight.ConnectRig(link.GetComponent<Rigidbody2D>());
                //StartCoroutine("PushNet");//给网施加力，营造随风摆动的效果，效果不理想
            }
        }

    }

    //给网施加力
    //IEnumerator PushNet()
    //{
    //    yield return new WaitForSeconds(3);
    //    Vector3 direction = Vector3.left + Vector3.up;
    //    netweight.gameObject.GetComponent<Rigidbody2D>().AddForce(direction.normalized * 1000);
    //    Debug.Log("协程被调用");
    //}
}
